// 用于对axios进行二次封装
// 1:创建新的axios实例
import store from '@/store'
import axios from 'axios'
const instance = axios.create({
  // axios配置, baseURL 和timeout
  // baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net', // 基地址
  baseURL: 'https://apipc-xiaotuxian-front.itheima.net',
  timeout: 4000 // 最长等待4秒钟得不到请求回应就报错
})

// 2:二次封装补充axios工具函数
function request (url, method, submitData) {
  // 负责发送请求: 参数分别代表请求地址,请求方式,提交的参数数据
  return instance({
    url,
    method,
    // submitData // 因为对于不同的请求需要使用parmas或者data来传递所以这里需要加一个判断
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
    // []表示可以动态获取属性名,[]中可以写表达式
    // post==>data传参
    // get==>params传参
  })
}

export default request

// 拦截器配置
// 1:请求拦截器:发出请求之前进入拦截器函数,进行添加token的操作
// 2:响应拦截器:在响应从服务器回来之后,先进入响应拦截器函数
// a>:统一处理401问题[token失效/过期]
// b>:简化数据data的获取方式
instance.interceptors.request.use(
  config => {
    // 注入token
    const token = store.state.user.profile.token
    // 在请求头中添加
    if (token) {
      config.headers.Authorization = `Bearer${token}`
    }
    return config
  },
  error => {
    // 提示错误原因
    console.log(error)
    return Promise.reject(error)
  }
)

// 响应拦截器
// 默认情况下,axios会自动给后段返回的数据二次处理,在外层补充data
instance.interceptors.response.use(
  response => {
    return response.data
  },
  error => {
    // 统一处理401
    return Promise.reject(error)
  }
)
